﻿using System;
using Dimebrain.TweetSharp.Fluent.Services;
using Dimebrain.TweetSharp.Model;

namespace Dimebrain.TweetSharp.Fluent
{
    /// <summary>
    /// Paramters used in Twitter queries
    /// </summary>
    public interface IFluentTwitterParameters
    {
        /// <summary>
        /// Gets or sets the activity.
        /// </summary>
        /// <value>The activity.</value>
        string Activity { get; set; }

        /// <summary>
        /// Gets or sets the action.
        /// </summary>
        /// <value>The action.</value>
        string Action { get; set; }

        /// <summary>
        /// Gets or sets the since date.
        /// </summary>
        /// <value>The since date.</value>
        DateTime? SinceDate { get; set; }

        /// <summary>
        /// Gets or sets the since id.
        /// </summary>
        /// <value>The since id.</value>
        long? SinceId { get; set; }

        /// <summary>
        /// Gets or sets the max id.
        /// </summary>
        /// <value>The max id.</value>
        long? MaxId { get; set; }

        /// <summary>
        /// Gets or sets the count of objects to return.
        /// </summary>
        /// <value>The count.</value>
        int? Count { get; set; }

        /// <summary>
        /// Gets or sets the page of objects to request.
        /// </summary>
        /// <value>The page.</value>
        int? Page { get; set; }

        /// <summary>
        /// Gets or sets the number if items per page to return
        /// </summary>
        /// <value>The return per page.</value>
        int? ReturnPerPage { get; set; }

        /// <summary>
        /// Gets or sets the requested id.
        /// </summary>
        /// <value>The id.</value>
        long? Id { get; set; }

        /// <summary>
        /// Gets or sets the requested screenname
        /// </summary>
        /// <value>The screenname</value>
        string ScreenName { get; set; }

        /// <summary>
        /// Gets or sets the text.
        /// </summary>
        /// <value>The text.</value>
        string Text { get; set; }

        /// <summary>
        /// Gets or sets the "in reply to status id" parameter
        /// </summary>
        /// <value>The in reply to status id.</value>
        long? InReplyToStatusId { get; set; }

        /// <summary>
        /// Gets or sets the email address parameter.
        /// </summary>
        /// <value>The email.</value>
        string Email { get; set; }

        /// <summary>
        /// Gets or sets the user screen name parameter
        /// </summary>
        /// <value>The user screen name parameter.</value>
        string UserScreenName { get; set; }

        /// <summary>
        /// Gets or sets the user id parameter.
        /// </summary>
        /// <value>The user id parameter.</value>
        long? UserId { get; set; }

        /// <summary>
        /// Gets or sets the follow parameter.
        /// </summary>
        /// <value>The follow parameter.</value>
        bool? Follow { get; set; }

        /// <summary>
        /// Gets or sets the verify id parameter.
        /// </summary>
        /// <value>The verify id.</value>
        long? VerifyId { get; set; }

        /// <summary>
        /// Gets or sets the verify screen name parameter.
        /// </summary>
        /// <value>The verify screen name parameter.</value>
        string VerifyScreenName { get; set; }

        // Extras

        /// <summary>
        /// Gets or sets the post image path.
        /// </summary>
        /// <value>The post image path.</value>
        string PostImagePath { get; set; }
        
        /// <summary>
        /// Gets or sets the post image provider.
        /// </summary>
        /// <value>The post image provider.</value>
        SendPhotoServiceProvider? PostImageProvider { get; set; }
        
        /// <summary>
        /// Gets or sets a direct URL path to use in place of a fluent query.
        /// </summary>
        string DirectPath { get; set; }

        /// <summary>
        /// Gets or sets the geospatial location of the query, if applicable.
        /// </summary>
        GeoLocation? GeoLocation { get; set; }
    }
}
